package com.demo.java.OD301_350.OD346;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【评论转换输出(B卷)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146160174
 */
public class OdMain {
    public static void main(String[] args) {
        // 使用Scanner类获取输入
        Scanner scanner = new Scanner(System.in);

        // 读取输入字符串，并按逗号分割成数组
        String[] comments = scanner.nextLine().split(",");
        scanner.close();

        // 创建一个树结构，这里用ArrayList来存储每一层的节点
        ArrayList<ArrayList<String>> tree = new ArrayList<>();

        // 使用LinkedList来存储从输入中分割出的所有节点和子节点数量
        LinkedList<String> nodes = new LinkedList<>(Arrays.asList(comments));

        // 初始层级为1
        int level = 1;

        // 开始从节点队列中逐一处理
        while (!nodes.isEmpty()) {
            // 取出当前节点
            String comment = nodes.removeFirst();

            // 确保当前层级在树中已经存在
            ensureLevelExists(tree, level);

            // 将当前节点添加到对应的层级中
            tree.get(level - 1).add(comment);

            // 取出该节点的子节点数量
            int childCount = Integer.parseInt(nodes.removeFirst());

            // 递归处理该节点的子节点
            recursive(nodes, level + 1, childCount, tree);
        }

        // 打印树结构
        printTree(tree);
    }

    // 确保树的当前层级存在，如果不存在则创建一个新的层级
    private static void ensureLevelExists(ArrayList<ArrayList<String>> tree, int level) {
        if (tree.size() < level) {
            tree.add(new ArrayList<>());
        }
    }

    // 递归处理子节点
    private static void recursive(LinkedList<String> nodes, int level, int childCount, ArrayList<ArrayList<String>> tree) {
        // 遍历所有的子节点
        for (int i = 0; i < childCount; i++) {
            // 取出当前子节点
            String comment = nodes.removeFirst();

            // 确保当前层级在树中已经存在
            ensureLevelExists(tree, level);

            // 将当前子节点添加到对应的层级中
            tree.get(level - 1).add(comment);

            // 取出该子节点的子节点数量
            int count = Integer.parseInt(nodes.removeFirst());

            // 如果有子节点，则递归处理
            if (count > 0) {
                recursive(nodes, level + 1, count, tree);
            }
        }
    }

    // 打印树的层级结构
    private static void printTree(ArrayList<ArrayList<String>> tree) {
        // 输出树的层级数
        System.out.println(tree.size());

        // 遍历所有层级，输出每层的节点
        for (ArrayList<String> nodes : tree) {
            // 将每层的节点连接成一个字符串，并打印出来
            System.out.println(String.join(" ", nodes));
        }
    }
}